前幾篇我們將 Kubernetes 及 Istio 環境架設完成。接下來這幾篇想先在不使用到 Istio 情況下,透過一個實際的 Microservices 專案,帶你了解 Kubernetes 能夠幫助你完成什麼。
Bookinfo Application 為 Istio 提供的 Microservices 實驗環境,想了解完整程式碼可以到 Istio github 查看。
Bookinfo 由4種 Microservices 構成
Productpage: 以 Python 撰寫,會呼叫 Reviews 及 Details 元件,並渲染整個畫面Details: 以 Ruby 撰寫,儲存書籍的資訊Reviews: 以 Java 撰寫,儲存書籍的評論Ratings: 以 Node.js 撰寫,儲存書籍的評分而 Reviews 會有3個版本
Version v1 不會呼叫 Ratings 元件Version v2 會呼叫 Ratings 元件,並以黑色星星顯示評分Version v3 會呼叫 Ratings 元件,並以紅色星星顯示評分
Bookinfo 專案完整呈現 Microservice 的特色,元件可由不同程式撰寫,並只負責單一功能,且開放API以供呼叫,最後由這些元件構成完整的服務,接下來我們就實際安裝看看吧!
本篇參考 Bookinfo Application,因為還不會使用到 Istio 功能,怕混淆大家,所以先把 Istio 注入 Sidecar 的功能取消,此步驟只需將 Namespace 上的 istio-injection Label 清除即可
istio-injection Label
kubectl label namespace default istio-injection-
kubectl get namespace -L istio-injection
(輸出結果)
NAME              STATUS   AGE   ISTIO-INJECTION
default           Active   37h
...
在 bookinfo.yaml 已經定義好應用程式的 Services、Service accounts 及 Deployments 等 Kubernetes 元件,只需部屬此 Yaml 檔案即可完成安裝。
kubectl apply -f <file> 部屬應用程式kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.15/samples/bookinfo/platform/kube/bookinfo.yaml
kubectl get deployment 查看 Deploymentkubectl get deployment
(輸出結果)
# 等待直到所有 Deployment 都 Ready
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
details-v1       1/1     1            1           2m5s
productpage-v1   1/1     1            1           2m4s
ratings-v1       1/1     1            1           2m5s
reviews-v1       1/1     1            1           2m4s
reviews-v2       1/1     1            1           2m4s
reviews-v3       1/1     1            1           2m4s
kubectl get service 查看 Servicekubectl get service
(輸出結果)
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.109.235.146   <none>        9080/TCP   2m19s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    24h
productpage   ClusterIP   10.110.214.148   <none>        9080/TCP   2m18s
ratings       ClusterIP   10.110.225.213   <none>        9080/TCP   2m19s
reviews       ClusterIP   10.110.68.97     <none>        9080/TCP   2m18s
部屬完成後,就可以嘗試連接到應用程式。
kubectl port-forward svc/<service> <server port>:<service port>,將流量打入 Productagekubectl port-forward svc/productpage 8080:9080
# 在瀏覽器輸入
http://127.0.0.1:8080/productpage

成功顯示畫面後可多重新整理幾次觀察變化
Microservices 是由不同的元件組成完整服務,但若其中一個元件 Crash 掉,系統是否還能運作,接著就讓我們實驗看看吧!

頁面中的內容是由不同功能的元件藉由 API 組合而成
試著將 details 元件刪除,觀察會發生什麼事。
kubectl delete deployment <name> 刪除 Deploymentkubectl delete deployment details-v1
(輸出結果)
deployment.apps "details-v1" deleted
kubectl port-forward svc/productpage 8080:9080
http://127.0.0.1:8080/productpage

雖然 Details 元件被我們移除了,但頁面中的其他功能還是能正常顯示
本篇我們完成了 Bookinfo 的安裝,並設計了簡單的實驗來了解當微服務中的元件掛了系統仍然有機會保持運作,下一篇將繼續介紹 Bookinfo 專案。